package org.foo.policy; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.ServiceReference; import org.osgi.service.condpermadmin.ConditionalPermissionAdmin; import org.osgi.service.condpermadmin.ConditionalPermissionInfo; import org.osgi.service.condpermadmin.ConditionalPermissionUpdate; public class Activator implements BundleActivator { public void start(BundleContext context) throws Exception { File policyFile = getPolicyFile(context); List<String> encodedInfos = readPolicyFile(policyFile); encodedInfos.add(0, "ALLOW {" + "[org.osgi.service.condpermadmin.BundleLocationCondition \"" + context.getBundle().getLocation() + "\"]" + "(java.security.AllPermission \"*\" \"*\")" + "} \"Management Agent Policy\""); ConditionalPermissionAdmin cpa = getConditionalPermissionAdmin(context); ConditionalPermissionUpdate u = cpa.newConditionalPermissionUpdate(); List infos = u.getConditionalPermissionInfos(); infos.clear(); for (String encodedInfo : encodedInfos) { infos.add(cpa.newConditionalPermissionInfo(encodedInfo)); } if (!u.commit()) { throw new ConcurrentModificationException( "Permissions changed during update"); } } private File getPolicyFile(BundleContext context) throws BundleException { String policyFilePath = context.getProperty("org.foo.policy.file"); if (policyFilePath == null) { policyFilePath = "security.policy"; } File policyFile = new File(policyFilePath); if (!policyFile.isFile()) { throw new BundleException("No policy file at: " + policyFile.getAbsolutePath()); } return policyFile; } private List<String> readPolicyFile(File policyFile) throws Exception { BufferedReader policyReader = null; Exception org = null; try { policyReader = new BufferedReader(new FileReader(policyFile)); List policy = new ArrayList(); StringBuffer buffer = new StringBuffer(); for (String input = policyReader.readLine(); input != null; input = policyReader.readLine()) { if (!input.trim().startsWith("#")) { buffer.append(input); if (input.contains("}")) { policy.add(buffer.toString()); buffer = new StringBuffer(); } } } return policy; } catch (Exception ex) { org = ex; throw ex; } finally { if (policyReader != null) { try { policyReader.close(); } catch (Exception ex) { if (org == null) { throw ex; } } } } } public void stop(BundleContext context) throws Exception { } private ConditionalPermissionAdmin getConditionalPermissionAdmin(BundleContext context) throws BundleException { ServiceReference ref = context.getServiceReference(ConditionalPermissionAdmin.class.getName()); ConditionalPermissionAdmin result = null; if (ref != null) { result = (ConditionalPermissionAdmin) context.getService(ref); } return result; } }